#include "stk_content_length.h"

using namespace stk;

ContentLength::ContentLength()
{
    SetType(STK_FD_NAME_CONTENT_LENGTH);
    m_strValue = "";
}

ContentLength::ContentLength(const ContentLength &src)
{
    *this = src;
}

ContentLength::ContentLength(const char *buf, int len)
{
    SetType(STK_FD_NAME_CONTENT_LENGTH);
    parse(buf, len);
}

ContentLength::~ContentLength()
{
    clear();
}

void ContentLength::clear()
{
    m_strValue = "";
}


bool ContentLength::isvalid() const
{
    return (!m_strValue.empty());
}


int32_t ContentLength::to_str (string &str)
{
    if (!isvalid())
    {
        printf("ERRO: <%010d> <%s.ToStr> Invalid Field, \n", GetSession(), GetTypeName());
        return -1;
    }

    str += m_strValue;

    return 0;
}


/*
 * 从头域解析的值与实际的长度可能不一致
 */
int32_t ContentLength::parse (const char *buf, int len)
{
    clear();

    while (buf && len > 0 && buf[0] == ' ')
    {
        buf++ ;
        len--;
    }

    if (buf == NULL || buf[0] == '\0')
    {
        printf("ERRO: <%010d> <%s.Parse> Invalid Buffer\n", GetSession(), GetTypeName());
        return -1;
    }

    m_strValue.assign(buf, len);

    return 0;                     /* ok */
}

ContentLength& ContentLength::operator = (const ContentLength &src)
{
    clear();

    m_strValue = src.m_strValue;

    MsgField::operator=(src);

    return *this;
}
